package com.gvillain.perso.mail;

import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Flags.Flag;

/**
 * Classe de réception des mails avec un serveur pop3
 * @author patrick ferreira 
 * Project : Javamail 
 * Class : org.insia.vmail.mail.pop
 * File : PopMail.java 
 * Created : 23 nov. 06 09:45:06
 */

public class PopMail {
	
    private final static String HOST = "mail.pop3.host";
    private final static String FOLDER = "INBOX";
    private Properties prop = new Properties();
    private Session session = null;
    private MailAuthentificator auth = null;
    private Store store = null;
    private Folder folder = null;


    /**
     * Constructeur
     * @param mailHost
     * @param auth
     */
    public PopMail(String mailHost, MailAuthentificator auth) {
        prop.put(HOST, mailHost);
        this.auth = auth;
    }

    /**
     * Initialise la classe et se connecte au serveur et ouvre le dossier par défaut
     * @throws MessagingException
     */
    public void Initialize() throws MessagingException {
        prop.put("mail.pop3.auth", "true");
        session = Session.getInstance(prop, auth);
        store = session.getStore("pop3");
        store.connect();
        folder = store.getFolder(FOLDER);
        folder.open(Folder.READ_ONLY);
    }

    
    /**
     * Retourne le nombre de nouveaux messages
     * @see org.insia.vmail.mail.common.MailReceiver#getNewMessageCount()
     * @return le nombre de nouveaux messages
     */
    public int getNewMessageCount() {
        if (folder != null)
            try {
                return folder.getNewMessageCount();
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        return 0;
    }

   
    /**
     * Retourne le nombre de mails
     * @see org.insia.vmail.mail.common.MailReceiver#getMessageCount()
     * @return le nombre total de messages
     */
    public int getMessageCount() {
        if (folder != null)
            try {
                return folder.getMessageCount();
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        return 0;
    }

    
    /**
     * Retourne le nombre de messages non lu(s)
     * @see org.insia.vmail.mail.common.MailReceiver#getUnreadMessageCount()
     * @return le nombre de messages non lu(s)
     */
    public int getUnreadMessageCount() {
        if (folder != null)
            try {
                return folder.getUnreadMessageCount();
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        return 0;
    }

    
    /**
     * Retourne une liste de header de message en fonction de la date du gregorian calendar
     * @param calendar
     * @return une liste de header de message en fonction de la date du gregorian calendar
     * @throws IOException
     */
    /*
    public List<MessageHeader> getMailSearch(GregorianCalendar calendar)
            throws IOException {
        List<MessageHeader> headmsg = new LinkedList<MessageHeader>();
        try {
            SearchTerm search = new SentDateTerm(ComparisonTerm.GE, calendar
                    .getTime());
            message = folder.search(search);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        for (Message msg : message) {
            try {
                headmsg.add(new MessageHeader(msg.getMessageNumber(), msg
                        .getFrom()[0], msg.getSentDate(), msg.getSubject(), msg
                        .getFlags(), msg.getContentType(), msg.getSize()));
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
        Collections.reverse(headmsg);
        return headmsg;
    }
	*/
  
    /**
     * Retourne une liste des headers de tous les messages du serveur
     * @see org.insia.vmail.mail.common.MailReceiver#getMail(int, int)
     * @return une liste des headers de tous les messages du serveur 
     */
    /*
    public List<MessageHeader> getMail(int start, int end) throws IOException {
        List<MessageHeader> headmsg = new LinkedList<MessageHeader>();
        try {
            message = folder.getMessages(start, end);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        for (Message msg : message) {
            try {
                headmsg.add(new MessageHeader(msg.getMessageNumber(), msg
                        .getFrom()[0], msg.getSentDate(), msg.getSubject(), msg
                        .getFlags(), msg.getContentType(), msg.getSize()));
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
        Collections.reverse(headmsg);
        return headmsg;
    }
    */

    
    /** 
     * Retoure un message en fonction de son id
     * @see org.insia.vmail.mail.common.MailReceiver#getMessageById(int)
     * @return un message en fonction de son id
     */
    public Message getMessageById(int id) {
        Message tmp = null;
        try {
            tmp = folder.getMessage(id);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return tmp;
    }

    
    /**
     * Supprime un message par son id
     * @see org.insia.vmail.mail.common.MailReceiver#deleteMessageById(javax.mail.Message)
     */
    public void deleteMessageById(Message msgtodel) {
        if (session != null) {
            try {
                msgtodel.setFlag(Flag.DELETED, true);
                folder.close(true);
                folder.open(Folder.READ_WRITE);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
    }
}
